package com.lagou.edu.datasource;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;

/**
 * JdbcTemplate工厂Bean
 */
@Slf4j
@Component("zkJdbcTemplate")
public class JDBCTemplateFactory extends AbstractFactoryBean<JdbcTemplate> {
    private static JdbcTemplate jdbcTemplate = null;
    @Autowired
    private ApplicationContext context;

    public JDBCTemplateFactory() {
        setSingleton(false);
    }

    /**
     * 当 Datasource 变化时，清空 Bean 实例
     * 在下次获取 Bean 时重建，以应用新数据源
     */
    static void refresh() {
        jdbcTemplate = null;
    }

    @Override
    public Class<?> getObjectType() {
        return JdbcTemplate.class;
    }

    /**
     * 获取 Bean 实例，模拟项目忽略并发时的线程安全问题
     *
     * @return
     */
    @Override
    protected JdbcTemplate createInstance() {
        if (jdbcTemplate != null) {
            return jdbcTemplate;
        }
        // 如果Bean实例不存在或被清空，则新建
        JdbcTemplate template = new JdbcTemplate();
        DataSource dataSource = context.getBean("zkDatasource", DataSource.class);
        template.setDataSource(dataSource);
        return template;
    }
}
